home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BBS Toolkit
/
BBS Toolkit.iso
/
wildcat
/
wc30rec.zip
/
BTREEF.PAS
next >
Wrap
Pascal/Delphi Source File
|
1992-05-12
|
8KB
|
251 lines
function BuildFileKey(var Data : FileRecordType; KeyNr : Byte) : IsamKeyStr;
{-Build keys for file record}
begin
with Data do
case KeyNr of
FileNameKey : BuildFileKey := PackFileName(FileName);
FileAreaKey : BuildFileKey := WordToKey(Area)+PackFileName(FileName);
FileDateKey : BuildFileKey := WordToKey(Area)+WordToKey(DateAndTime.D)+LongToKey(DateAndTime.T);
FilePWKey : BuildFileKey := Long2Str(Ord(WordFlagSet(FileToggles, fiPasswordReq)))+PackFileName(FileName);
FileUpKey : if UploadedBy <> '' then
BuildFileKey := Pack6BitKeyUC(UploadedBy, 19)
else
BuildFileKey := '';
end;
end;
function BuildKWKey(KeyWord : Str10) : Str08;
{-Build keyword key}
begin
if KeyWord = '' then
BuildKWKey := ''
else
BuildKWKey := Pack6BitKeyUC(KeyWord, 8);
end;
procedure CleanUpKeyWords(var KeyWords : KeyArray);
{-Removes duplicate keywords}
var
X, Y : Byte;
SearchName : SearchArray;
procedure RemoveIfDup(StartPos : Byte);
var
I : Byte;
Key : String[8];
begin
Key := Pack6BitKeyUC(SearchName[StartPos], 8);
for I := StartPos + 1 to 6 do
if (Key = Pack6BitKeyUC(SearchName[I], 8)) then
begin
SearchName[StartPos] := '';
Exit;
end;
end;
begin
for Y := 1 to 6 do
SearchName[Y] := stupcase(Trim(KeyWords[Y]));
for Y := 1 to 5 do
if (SearchName[Y] <> '') then
RemoveIfDup(Y);
if (KeyStringFound('BADKEYS.LST', SearchName, False)) then
{ignore};
X := 0;
for Y := 1 to 6 do
if (SearchName[Y] <> '') then
begin
Inc(X);
KeyWords[X] := SearchName[Y];
end;
for Y := X + 1 to 6 do
KeyWords[Y] := '';
end;
function AddFileRecord(var Data : FileRecordType) : Boolean;
{-Add a new file record to the database}
var
X, KeyNr : Byte;
RefNr : LongInt;
Key : IsamKeyStr;
LockStatus : Boolean;
Len : Word;
begin
AddFileRecord := False;
LockStatus := LockBTree(dbFile);
FindBtreeKey(FileSpec, RefNr, BuildFileKey(Data, FileNameKey), FileNameKey);
if not IsamOk then
with Data do
begin
FileName := StUpcase(FileName);
CleanUpKeyWords(KeyWords);
Len := (SizeOf(FileRecordType) - 2048) + TotalMsgBytes;
BtAddVariableRec(FileSpec, RefNr, Data, Len);
if not IsamOk then
LogFatalError('Unable to add file record', IsamError);
for KeyNr := 1 to KeysDatabase[dbFile] do
if KeyNr < 6 then
begin
Key := BuildFileKey(Data, KeyNr);
if Key <> '' then
begin
BtAddKey(FileSpec, KeyNr, RefNr, Key);
if not IsamOk then
LogFatalError('Unable to add file key #'+Long2Str(KeyNr), IsamError);
end;
end
else
for X := 1 to 6 do
if KeyWords[X] <> '' then
begin
Key := BuildKwKey(KeyWords[X]);
BtAddKey(FileSpec, KeyNr, RefNr, Key);
if not IsamOk then
LogFatalError('Unable to add file key #'+Long2Str(KeyNr), IsamError);
end;
AddFileRecord := True;
end;
if LockStatus then
UnLockBtree(dbFile);
end;
function UpdateFileRecord(var NewData : FileRecordType; OldName : Str12) : Boolean;
{-Update an existing file record}
label
ExitPoint;
var
X,
KeyNr : Byte;
OldData : FileRecordType;
RefNr : LongInt;
Key : IsamKeyStr;
LockStatus : Boolean;
begin
UpdateFileRecord := False;
LockStatus := LockBTree(dbFile);
OldName := StUpcase(OldName);
NewData.FileName := StUpcase(NewData.FileName);
if OldName <> NewData.FileName then
if FileInDataBase(NewData.FileName, RefNr) then
goto ExitPoint;
if FileInDataBase(OldName, RefNr) then
begin
CleanUpKeyWords(NewData.KeyWords);
GetBtreeVarRec(FileSpec, RefNr, OldData);
if not IsamOk then
LogFatalError('Unable to load file record', IsamError);
for KeyNr := 1 to KeysDatabase[dbFile] do
if KeyNr < 6 then
begin
Key := BuildFileKey(OldData, KeyNr);
if (Key <> '') and (Key <> BuildFileKey(NewData, KeyNr)) then
begin
BtDeleteKey(FileSpec, KeyNr, RefNr, Key);
if not IsamOk then
LogFatalError('Unable to delete file key #'+Long2Str(KeyNr), IsamError);
end;
end
else
for X := 1 to 6 do
begin
Key := BuildKWKey(OldData.KeyWords[X]);
if (Key <> '') and (Key <> BuildKWKey(NewData.KeyWords[X])) then
begin
BtDeleteKey(FileSpec, KeyNr, RefNr, Key);
if not IsamOk then
LogFatalError('Unable to delete file key #'+Long2Str(KeyNr), IsamError);
end;
end;
BtPutVariableRec(FileSpec, RefNr, NewData, (SizeOf(FileRecordType) - 2048) + NewData.TotalMsgBytes);
if not IsamOk then
LogFatalError('Unable to update file record', IsamError);
for KeyNr := 1 to KeysDatabase[dbFile] do
if KeyNr < 6 then
begin
Key := BuildFileKey(NewData, KeyNr);
if (Key <> '') and (Key <> BuildFileKey(OldData, KeyNr)) then
begin
BTAddKey(FileSpec, KeyNr, RefNr, Key);
if not IsamOk then
LogFatalError('Unable to add file key #'+Long2Str(KeyNr), IsamError);
end;
end
else
for X := 1 to 6 do
begin
Key := BuildKWKey(NewData.KeyWords[X]);
if (Key <> '') and (Key <> BuildKWKey(OldData.KeyWords[X])) then
begin
BTAddKey(FileSpec, KeyNr, RefNr, Key);
if not IsamOk then
LogFatalError('Unable to add file key #'+Long2Str(KeyNr), IsamError);
end;
end;
UpdateFileRecord := True;
end;
ExitPoint:
if LockStatus then
UnLockBtree(dbFile);
end;
function DeleteFileRecord(var Data : FileRecordType) : Boolean;
{-Delete file record from database}
var
X, KeyNr : Byte;
RefNr : LongInt;
Key : IsamKeyStr;
LockStatus : Boolean;
begin
DeleteFileRecord := False;
LockStatus := LockBTree(dbFile);
FindBtreeKey(FileSpec, RefNr, BuildFileKey(Data, FileNameKey), FileNameKey);
if IsamOk then
begin
GetBtreeVarRec(FileSpec, RefNr, Data);
if not IsamOk then
LogFatalError('Unable to load file record', IsamError);
for KeyNr := 1 to KeysDatabase[dbFile] do
if KeyNr < 6 then
begin
Key := BuildFileKey(Data, KeyNr);
if Key <> '' then
begin
BtDeleteKey(FileSpec, KeyNr, RefNr, Key);
if not IsamOk then
LogFatalError('Unable to delete file key #'+Long2Str(KeyNr), IsamError);
end;
end
else
for X := 1 to 6 do
begin
Key := BuildKWKey(Data.KeyWords[X]);
if Key <> '' then
begin
BtDeleteKey(FileSpec, KeyNr, RefNr, Key);
if not IsamOk then
LogFatalError('Unable to delete file key #'+Long2Str(KeyNr), IsamError);
end;
end;
BtDeleteVariableRec(FileSpec, RefNr);
if not IsamOk then
LogFatalError('Unable to delete file record', IsamError);
DeleteFileRecord := True;
end;
if LockStatus then
UnLockBtree(dbFile);
end;